/**
 * jQuery EasyUI 1.4.2
 *
 * Copyright (c) 2009-2015 www.jeasyui.com. All rights reserved.
 *
 * Licensed under the GPL license: http://www.gnu.org/licenses/gpl.txt
 * To use it on other terms please contact us at info@jeasyui.com
 *
 */
(function ($) {
    $(function () {
        $(document).unbind(".combo").bind("mousedown.combo mousewheel.combo", function (e) {
            var p = $(e.target).closest("span.combo,div.combo-p,div.menu");
            if (p.length) {
                _1(p);
                return;
            }
            $("body>div.combo-p>div.combo-panel:visible").panel("close");
        });
    });
    function _2(_3) {
        var _4 = $.data(_3, "combo");
        var _5 = _4.options;
        if (!_4.panel) {
            _4.panel = $("<div class=\"combo-panel\"></div>").appendTo("body");
            _4.panel.panel({
                minWidth: _5.panelMinWidth,
                maxWidth: _5.panelMaxWidth,
                minHeight: _5.panelMinHeight,
                maxHeight: _5.panelMaxHeight,
                doSize: false,
                closed: true,
                cls: "combo-p",
                style: {position: "absolute", zIndex: 10},
                onOpen: function () {
                    var _6 = $(this).panel("options").comboTarget;
                    var _7 = $.data(_6, "combo");
                    if (_7) {
                        _7.options.onShowPanel.call(_6);
                    }
                },
                onBeforeClose: function () {
                    _1(this);
                },
                onClose: function () {
                    var _8 = $(this).panel("options").comboTarget;
                    var _9 = $(_8).data("combo");
                    if (_9) {
                        _9.options.onHidePanel.call(_8);
                    }
                }
            });
        }
        var _a = $.extend(true, [], _5.icons);
        if (_5.hasDownArrow) {
            _a.push({
                iconCls: "combo-arrow", handler: function (e) {
                    _f(e.data.target);
                }
            });
        }
        $(_3).addClass("combo-f").textbox($.extend({}, _5, {
            icons: _a, onChange: function () {
            }
        }));
        $(_3).attr("comboName", $(_3).attr("textboxName"));
        _4.combo = $(_3).next();
        _4.combo.addClass("combo");
    };
    function _b(_c) {
        var _d = $.data(_c, "combo");
        var _e = _d.options;
        var p = _d.panel;
        if (p.is(":visible")) {
            p.panel("close");
        }
        if (!_e.cloned) {
            p.panel("destroy");
        }
        $(_c).textbox("destroy");
    };
    function _f(_10) {
        var _11 = $.data(_10, "combo").panel;
        if (_11.is(":visible")) {
            _12(_10);
        } else {
            var p = $(_10).closest("div.combo-panel");
            $("div.combo-panel:visible").not(_11).not(p).panel("close");
            $(_10).combo("showPanel");
        }
        $(_10).combo("textbox").focus();
    };
    function _1(_13) {
        $(_13).find(".combo-f").each(function () {
            var p = $(this).combo("panel");
            if (p.is(":visible")) {
                p.panel("close");
            }
        });
    };
    function _14(e) {
        var _15 = e.data.target;
        var _16 = $.data(_15, "combo");
        var _17 = _16.options;
        var _18 = _16.panel;
        if (!_17.editable) {
            _f(_15);
        } else {
            var p = $(_15).closest("div.combo-panel");
            $("div.combo-panel:visible").not(_18).not(p).panel("close");
        }
    };
    function _19(e) {
        var _1a = e.data.target;
        var t = $(_1a);
        var _1b = t.data("combo");
        var _1c = t.combo("options");
        switch (e.keyCode) {
            case 38:
                _1c.keyHandler.up.call(_1a, e);
                break;
            case 40:
                _1c.keyHandler.down.call(_1a, e);
                break;
            case 37:
                _1c.keyHandler.left.call(_1a, e);
                break;
            case 39:
                _1c.keyHandler.right.call(_1a, e);
                break;
            case 13:
                e.preventDefault();
                _1c.keyHandler.enter.call(_1a, e);
                return false;
            case 9:
            case 27:
                _12(_1a);
                break;
            default:
                if (_1c.editable) {
                    if (_1b.timer) {
                        clearTimeout(_1b.timer);
                    }
                    _1b.timer = setTimeout(function () {
                        var q = t.combo("getText");
                        if (_1b.previousText != q) {
                            _1b.previousText = q;
                            t.combo("showPanel");
                            _1c.keyHandler.query.call(_1a, q, e);
                            t.combo("validate");
                        }
                    }, _1c.delay);
                }
        }
    };
    function _1d(_1e) {
        var _1f = $.data(_1e, "combo");
        var _20 = _1f.combo;
        var _21 = _1f.panel;
        var _22 = $(_1e).combo("options");
        var _23 = _21.panel("options");
        _23.comboTarget = _1e;
        if (_23.closed) {
            _21.panel("panel").show().css({
                zIndex: ($.fn.menu ? $.fn.menu.defaults.zIndex++ : $.fn.window.defaults.zIndex++),
                left: -999999
            });
            _21.panel("resize", {
                width: (_22.panelWidth ? _22.panelWidth : _20._outerWidth()),
                height: _22.panelHeight
            });
            _21.panel("panel").hide();
            _21.panel("open");
        }
        (function () {
            if (_21.is(":visible")) {
                _21.panel("move", {left: _24(), top: _25()});
                setTimeout(arguments.callee, 200);
            }
        })();
        function _24() {
            var _26 = _20.offset().left;
            if (_22.panelAlign == "right") {
                _26 += _20._outerWidth() - _21._outerWidth();
            }
            if (_26 + _21._outerWidth() > $(window)._outerWidth() + $(document).scrollLeft()) {
                _26 = $(window)._outerWidth() + $(document).scrollLeft() - _21._outerWidth();
            }
            if (_26 < 0) {
                _26 = 0;
            }
            return _26;
        };
        function _25() {
            var top = _20.offset().top + _20._outerHeight();
            if (top + _21._outerHeight() > $(window)._outerHeight() + $(document).scrollTop()) {
                top = _20.offset().top - _21._outerHeight();
            }
            if (top < $(document).scrollTop()) {
                top = _20.offset().top + _20._outerHeight();
            }
            return top;
        };
    };
    function _12(_27) {
        var _28 = $.data(_27, "combo").panel;
        _28.panel("close");
    };
    function _29(_2a, _2b) {
        var _2c = $.data(_2a, "combo");
        var _2d = $(_2a).textbox("getText");
        if (_2d != _2b) {
            $(_2a).textbox("setText", _2b);
            _2c.previousText = _2b;
        }
    };
    function _2e(_2f) {
        var _30 = [];
        var _31 = $.data(_2f, "combo").combo;
        _31.find(".textbox-value").each(function () {
            _30.push($(this).val());
        });
        return _30;
    };
    function _32(_33, _34) {
        var _35 = $.data(_33, "combo");
        var _36 = _35.options;
        var _37 = _35.combo;
        if (!$.isArray(_34)) {
            _34 = _34.split(_36.separator);
        }
        var _38 = _2e(_33);
        _37.find(".textbox-value").remove();
        var _39 = $(_33).attr("textboxName") || "";
        for (var i = 0; i < _34.length; i++) {
            var _3a = $("<input type=\"hidden\" class=\"textbox-value\">").appendTo(_37);
            _3a.attr("name", _39);
            if (_36.disabled) {
                _3a.attr("disabled", "disabled");
            }
            _3a.val(_34[i]);
        }
        var _3b = (function () {
            if (_38.length != _34.length) {
                return true;
            }
            var a1 = $.extend(true, [], _38);
            var a2 = $.extend(true, [], _34);
            a1.sort();
            a2.sort();
            for (var i = 0; i < a1.length; i++) {
                if (a1[i] != a2[i]) {
                    return true;
                }
            }
            return false;
        })();
        if (_3b) {
            if (_36.multiple) {
                _36.onChange.call(_33, _34, _38);
            } else {
                _36.onChange.call(_33, _34[0], _38[0]);
            }
            $(_33).closest("form").trigger("_change", [_33]);
        }
    };
    function _3c(_3d) {
        var _3e = _2e(_3d);
        return _3e[0];
    };
    function _3f(_40, _41) {
        _32(_40, [_41]);
    };
    function _42(_43) {
        var _44 = $.data(_43, "combo").options;
        var _45 = _44.onChange;
        _44.onChange = function () {
        };
        if (_44.multiple) {
            _32(_43, _44.value ? _44.value : []);
        } else {
            _3f(_43, _44.value);
        }
        _44.onChange = _45;
    };
    $.fn.combo = function (_46, _47) {
        if (typeof _46 == "string") {
            var _48 = $.fn.combo.methods[_46];
            if (_48) {
                return _48(this, _47);
            } else {
                return this.textbox(_46, _47);
            }
        }
        _46 = _46 || {};
        return this.each(function () {
            var _49 = $.data(this, "combo");
            if (_49) {
                $.extend(_49.options, _46);
                if (_46.value != undefined) {
                    _49.options.originalValue = _46.value;
                }
            } else {
                _49 = $.data(this, "combo", {
                    options: $.extend({}, $.fn.combo.defaults, $.fn.combo.parseOptions(this), _46),
                    previousText: ""
                });
                _49.options.originalValue = _49.options.value;
            }
            _2(this);
            _42(this);
        });
    };
    $.fn.combo.methods = {
        options: function (jq) {
            var _4a = jq.textbox("options");
            return $.extend($.data(jq[0], "combo").options, {
                width: _4a.width,
                height: _4a.height,
                disabled: _4a.disabled,
                readonly: _4a.readonly
            });
        }, cloneFrom: function (jq, _4b) {
            return jq.each(function () {
                $(this).textbox("cloneFrom", _4b);
                $.data(this, "combo", {
                    options: $.extend(true, {cloned: true}, $(_4b).combo("options")),
                    combo: $(this).next(),
                    panel: $(_4b).combo("panel")
                });
                $(this).addClass("combo-f").attr("comboName", $(this).attr("textboxName"));
            });
        }, panel: function (jq) {
            return $.data(jq[0], "combo").panel;
        }, destroy: function (jq) {
            return jq.each(function () {
                _b(this);
            });
        }, showPanel: function (jq) {
            return jq.each(function () {
                _1d(this);
            });
        }, hidePanel: function (jq) {
            return jq.each(function () {
                _12(this);
            });
        }, clear: function (jq) {
            return jq.each(function () {
                $(this).textbox("setText", "");
                var _4c = $.data(this, "combo").options;
                if (_4c.multiple) {
                    $(this).combo("setValues", []);
                } else {
                    $(this).combo("setValue", "");
                }
            });
        }, reset: function (jq) {
            return jq.each(function () {
                var _4d = $.data(this, "combo").options;
                if (_4d.multiple) {
                    $(this).combo("setValues", _4d.originalValue);
                } else {
                    $(this).combo("setValue", _4d.originalValue);
                }
            });
        }, setText: function (jq, _4e) {
            return jq.each(function () {
                _29(this, _4e);
            });
        }, getValues: function (jq) {
            return _2e(jq[0]);
        }, setValues: function (jq, _4f) {
            return jq.each(function () {
                _32(this, _4f);
            });
        }, getValue: function (jq) {
            return _3c(jq[0]);
        }, setValue: function (jq, _50) {
            return jq.each(function () {
                _3f(this, _50);
            });
        }
    };
    $.fn.combo.parseOptions = function (_51) {
        var t = $(_51);
        return $.extend({}, $.fn.textbox.parseOptions(_51), $.parser.parseOptions(_51, ["separator", "panelAlign", {
            panelWidth: "number",
            hasDownArrow: "boolean",
            delay: "number",
            selectOnNavigation: "boolean"
        }, {
            panelMinWidth: "number",
            panelMaxWidth: "number",
            panelMinHeight: "number",
            panelMaxHeight: "number"
        }]), {
            panelHeight: (t.attr("panelHeight") == "auto" ? "auto" : parseInt(t.attr("panelHeight")) || undefined),
            multiple: (t.attr("multiple") ? true : undefined)
        });
    };
    $.fn.combo.defaults = $.extend({}, $.fn.textbox.defaults, {
        inputEvents: {click: _14, keydown: _19, paste: _19, drop: _19},
        panelWidth: null,
        panelHeight: 200,
        panelMinWidth: null,
        panelMaxWidth: null,
        panelMinHeight: null,
        panelMaxHeight: null,
        panelAlign: "left",
        multiple: false,
        selectOnNavigation: true,
        separator: ",",
        hasDownArrow: true,
        delay: 200,
        keyHandler: {
            up: function (e) {
            }, down: function (e) {
            }, left: function (e) {
            }, right: function (e) {
            }, enter: function (e) {
            }, query: function (q, e) {
            }
        },
        onShowPanel: function () {
        },
        onHidePanel: function () {
        },
        onChange: function (_52, _53) {
        }
    });
})(jQuery);

